﻿using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.Services;
using System.Xml;
using PAT.Data;
using PAT.Data.Bases;
using PAT.Entities;
using PAT.Services;
using PAT.Util;

public partial class aspx_rep01_ReporteCitas : System.Web.UI.Page
{
    #region Atributos
    private Common instanciaCommon = new Common();
    #endregion

    #region Eventos

    /// <summary>
    /// 
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            calFechaInicio.Format = calFechaFinal.Format = ConfigurationManager.AppSettings["DateFormat"];
            txtFechaInicio.Attributes.Add("readonly", "readonly");
            txtFechaFinal.Attributes.Add("readonly", "readonly");
            txtFechaInicio.Text = DateTime.Now.AddMonths(-1).ToString(ConfigurationManager.AppSettings["DateFormat"]);
            txtFechaFinal.Text = DateTime.Now.ToString(ConfigurationManager.AppSettings["DateFormat"]);

            UtilUI.BindListControl(ddlEstadoCita, instanciaCommon.GetEstadosCitaPorEstado(true), "IdEstadoCita", "DescripcionEstadoCita", true);
            UtilUI.BindListControl(ddlTaller, instanciaCommon.GetTallerPorEstado(true), "IdTaller", "DescripcionTaller", true);
        }
    }

    [WebMethod]
    public static String GenerarReporteCitas(String IdEstadoCita, String FechaInicio, String FechaFin, String IdTaller)
    {
        System.Globalization.DateTimeFormatInfo dtinfo = new System.Globalization.DateTimeFormatInfo();
        dtinfo.ShortDatePattern = ConfigurationManager.AppSettings["DateFormat"];
        dtinfo.DateSeparator = "/";
        DateTime fechaInicial = Convert.ToDateTime(FechaInicio, dtinfo);
        DateTime fechaFinal = Convert.ToDateTime(FechaFin, dtinfo);
        
        Reports instanciaReport = new Reports();
        Common instanciaCommon = new Common();

        DataSet dsReporte = instanciaReport.GetReporteCitas((IdEstadoCita == String.Empty ? Convert.ToByte(0) : Convert.ToByte(IdEstadoCita)),
                                                            fechaInicial,
                                                            fechaFinal,
                                                            (IdTaller == String.Empty ? -1 : Convert.ToInt32(IdTaller)));

        // Se carga el xml base para construir el chart
        XmlDocument docQuery = new XmlDocument();
        docQuery.LoadXml("<chart><categories /><dataset /></chart>");

        XmlNode nodeCategories = docQuery.SelectSingleNode("chart/categories");
        XmlNode nodeDataset = docQuery.SelectSingleNode("chart/dataset");

        // Las categorias son las barras que representan cada estado, Un solo dataset que contiene los datos del periodo seleccionado 
        // Carga de categorias
        if (IdEstadoCita == String.Empty)
        {
            // Se cargan todas los estados de cita activos como categorias
            TList<PatEstadoCita> lstEstados = instanciaCommon.GetEstadosCitaPorEstado(true);

            foreach (PatEstadoCita instEstado in lstEstados)
            {
                // Nodo de categoria
                XmlNode nodeCategory = docQuery.CreateElement("category");
                nodeCategory.Attributes.SetNamedItem(CreateNewAttribute(docQuery, "label", instEstado.DescripcionEstadoCita));
                nodeCategories.AppendChild(nodeCategory);

                // Nodo de valor en el dataset
                Int32 valueEstadoCita = (dsReporte.Tables[0].Compute("COUNT(ID_CITA)", String.Format("ID_ESTADO_CITA = '{0}'", instEstado.IdEstadoCita.ToString())) != null ? Convert.ToInt32(dsReporte.Tables[0].Compute("COUNT(ID_CITA)", String.Format("ID_ESTADO_CITA = '{0}'", instEstado.IdEstadoCita.ToString()))) : 0);
                XmlNode nodeValue = docQuery.CreateElement("set");
                nodeValue.Attributes.SetNamedItem(CreateNewAttribute(docQuery, "value", valueEstadoCita.ToString()));
                nodeDataset.AppendChild(nodeValue);
            }
        }
        else
        {
            // Se trae la información del estado seleccionado 
            PatEstadoCita instEstado = instanciaCommon.GetEstadoCitaPorId(Convert.ToByte(IdEstadoCita));

            XmlNode nodeCategory = docQuery.CreateElement("category");
            nodeCategory.Attributes.SetNamedItem(CreateNewAttribute(docQuery, "label", instEstado.DescripcionEstadoCita));
            nodeCategories.AppendChild(nodeCategory);

            Int32 valueEstadoCita = (dsReporte.Tables[0].Compute("COUNT(ID_CITA)", String.Format("ID_ESTADO_CITA = '{0}'", instEstado.IdEstadoCita.ToString())) != null ? Convert.ToInt32(dsReporte.Tables[0].Compute("COUNT(ID_CITA)", String.Format("ID_ESTADO_CITA = '{0}'", instEstado.IdEstadoCita.ToString()))) : 0);
            XmlNode nodeValue = docQuery.CreateElement("set");
            nodeValue.Attributes.SetNamedItem(CreateNewAttribute(docQuery, "value", valueEstadoCita.ToString()));
            nodeDataset.AppendChild(nodeValue);
        }

        return docQuery.OuterXml.Replace('"', '\'');
    }

    public static XmlAttribute CreateNewAttribute(XmlDocument parent, String nameAttribute, String valueAttribute)
    {
        XmlAttribute attr = parent.CreateAttribute(nameAttribute);
        attr.Value = valueAttribute;
        return attr;
    }

    #endregion
}
